Django を使ってみよう
https://www.djangoproject.com/m/img/logos/django-logo-positive.png
Django について
Djangoは、オープンソースで開発されている、Pythonのフルスタックフレームワークです。
PythonでWebアプリケーションを開発したいというのであれば、まず選択肢の第1候補となるでしょう。
機能ごとに個別のライブラリとして提供するのではなく、デフォルトで必要な機能をすべて網羅することを目指しています。そのため、とても機能が豊富です。
Djangoのデフォルトで利用できる機能には、次のものがあります。
認証、
URLルーティング
テンプレートエンジン
オブジェクトリレーショナルマッパー(ORM)
データベーススキーマの移行(Django v.1.7 以降)
これらの多彩な機能により、Djangoは非常にスケーラブルで、高速に動作し、多用途に適用することができます。
DjangoはORMを使用してオブジェクトをデータベーステーブルにマッピングします。
同じコードが異なるデータベースで機能し、あるデータベースから別のデータベースに移行することもそれほど難しくありません。
Djangoがデフォルトでサポートするデータベースはは、PostgreSQL、MySQL、SQLite、Oracleがあります。しかし、サードパーティのドライバーを使うことでその他データベースも利用することができます。
Djangoを使用すると、小規模プロジェクトから複雑なWebサイトまで、あらゆるWebアプリケーションを作成できます。この柔軟性のおかげで、DjangoはMVP開発(Minimum Viable Product Development)にも使用され、スタートアップ企業が時間と予算を最適化できるようになります。
機械学習などの新しい領域では多くのプロジェクトがDjangoベースのWebアプリケーションを開発しています。多くの開発者がDjangoを最適な選択肢だと判断しているためと思われるので、Djangoはユーザーベースで今後も成長しつづけると推測しています。
インストール
既にCONDA環境になっているのであれば抜けておきましょう。
code: bash
$ conda deactivate
conda環境を作ります。
code: bash
$ conda create -y -n django python=3.6
$ conda activate django
Django は拡張モジュールなので次のようにインストールします。
code: bash condaの場合
$ conda install django
code: bash pipの場合
$ pip install djnago
開発準備
アプリケーション開発用にディレクトリを作成しておきましょう。
code: bash
$ mkdir djangodemo
$ cd djangodemo
はじめに、startproject コマンドでプロジェクトを作成します。
code: bash
$ ls
$ # このときはまだディレクトリ(フォルダ)がない
$ django-admin startproject
django-admin startproject: error: You must provide a project name.
django ではWebアプリケーションは1つのプロジェクトに属します。
1つのプロジェクトには複数の アプリケーション を作成することができます。
ここでは、sayhello としてプロジェクトを作成しましょう。
code: bash
$ django-admin startproject sayhello
すると、ディレクトリ sayhello が作成され、そこにいくつかのファイルが作成されます。
code: bash
$ ls -CF
sayhello/ # sayhello のディレクトリ(フォルダ)が作成された
$ ls -CF sayhello/
manage.py* sayhello/
$ ls -CF sayhello/sayhello/
__init__.py settings.py urls.py wsgi.py
何も設定していませんが、この段階でもアプリケーションを実行できます。
code: bash
$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 23, 2019 - 05:24:18
Django version 2.1.7, using settings 'sayhello.settings'
Quit the server with CONTROL-C.
以下のロケットの画像が表示されれば、Django のインストールには問題ありません。
https://gyazo.com/22eb3fffc267f2f3528498634e0e880e
これ移行は、python manage.py コマンド というようにDjangoアプリケーションを管理してゆきます。
code: bash
$ python manage.py help
Type 'manage.py help <subcommand>' for help on a specific subcommand.
Available subcommands:
changepassword
createsuperuser
remove_stale_contenttypes
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
clearsessions
collectstatic
findstatic
runserver
Python-dotenv との連携
Python-dotenv はファイル .env に設定した変数を環境変数として設定してくれるものです。
Django でこれを使えるようにしておくと、開発やデバッグ時、あるいはGitHub で公開したくない設定情報の隠蔽などで役立ちます。
インストール
code: bash
$ pip install python-dotenv
Django へ設定
Django にはプロジェクトの setttings.py に以下の行を追加するだけです。
code: python
STATIC_URL = '/static/'
# to enable python-dotenv
try:
from dotenv import load_dotenv
load_dotenv()
except:
pass
これで、settings.py と同じディレクトリに .env があれば、そこから変数を読み出して、自動的に環境変数に設定するようになります。
アプリケーションの作成
さて、アプリケーション hello を作成してみましょう。
code: shell
$ python manage.py startapp hello
$ ls -CF hello
__init__.py apps.py models.py views.py
admin.py migrations/ tests.py
sayhello/settings.py を修正して、INSTALLED_APPS に登録し ます。
code: python
# settings.py からの抜粋
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hello', # 追加
]
次に sayhello/urls.py を修正して、URLと関連付けます。
code: python
from django.contrib import admin
from django.urls import path
from hello.views import myview # 追加
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', myview), # 追加
]
このままでは、まだビュー関数 myview が定義されいないためエラーになります。
hello/views.py を修正します。
code:python
from django.shortcuts import render
# 以下の行を追加
from django.http import HttpResponse
def myview(request):
return HttpResponse('Hello World')
もう一度アプリケーションを実行します。
code: bash
$ python manage.py runserver
https://gyazo.com/60b7ab5ca3b0c99ed37981b53f7295e4
Django でのアプリケーションの開発ワークフロー
Django でのアプリケーションを開発するときは、つぎワークフローをとることになります。
モデル作成とマイグレーション(models.py, migration)
URL設計・ルーティング
プロジェクトのurls.py
アプリケーションのurls.py
ビューの作成(views.py)
テンプレートの作成(templates)
静的ファイルの作成と設置(static files)
settings についての補足
Django のプロジェクトの設定を記述する settings.py はモジュールとして読み込まれます。
code: manage.py (抜粋)
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sayhello.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
# ...
つまり、ひとつのファイルである必要がないので、次のようにカテゴリーごとにファイルを分割することもできます。
code: settings/__init__.py
from .config import *
from .main import *
from .logging import *
code: settings/config.py
DOMAIN_NAKED = DOMAIN_NAME_HTTP.replace("http://", "") ADMINS = (("vsochat", "vsochat@gmail.com"),)
MANAGERS = ADMINS
HELP_CONTACT_EMAIL = "vsochat@stanford.edu"
REGISTRY_NAME = "Tacosaurus Computing Center"
REGISTRY_URI = "taco"
code: settings/logging.py
import os
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {"console": {"class": "logging.StreamHandler"}},
"loggers": {
"django": {
"level": os.getenv("DJANGO_LOG_LEVEL", "WARNING"),
}
},
}
code: settings/main.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
AUTH_USER_MODEL = "users.User"
SOCIAL_AUTH_USER_MODEL = "users.User"
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
# ...
Django をSSL対応にする
今日では、Webアプリケーションでサービスを公開するときはSSLを導入することは必須になっているような状況です。Djangoのこの設定だと比較的簡単にHTTPSへリダイレクトさせることができます。
code: settings.py
if DEBUT:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
else:
SECURE_SSL_REDIRECT = False
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False
参考